﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Läxomatic
{
    // Klass för att lagra svar från databasen.
    class Tabell<T>
    {   
        //Hjärtat i kalssen en jagged tvådimensionell generisk lista.
        private List<List<T>> _table;
        //Returnerar längd
        public int Length()
        {
            return _table.Count;
        }
        //Returnerar bredd
        public int Width()
        {
            return _table[0].Count;
        }
        //Returnerar en rad
        public List<T> getRow(int i)
        {
            return _table[i];
        }
        //returnerar ett specifikt element, eller sätter/skapar ett nytt.
        public T this[int x, int y]
        {
            get { return _table[x][y]; }
            set
            {
                if (x >= _table.Count)
                {
                    List<T> temp = new List<T>();
                    temp.Insert(y, value);
                    _table.Insert(x, temp);
                }
                else
                {
                    if ( y >= _table[x].Count)
                       _table[x].Insert(y, value);
                    else
                       _table[x][y] = value;
                }
        } 
        }
        //returnerar en viss kolumn.
        public List<T> getColumn(int column)
        {
            List<T> temp = new List<T>();

            for (int i = 0;i<_table.Count;i++)
                temp.Add(_table[i][column]);

            return temp;
        }
        //konstruktorn
        public Tabell(List<List<T>> table)
        {
            _table = table;
        }
        //Default-konstruktorn.
        public Tabell()
        {
            _table = new List<List<T>>();
        }
        //Returnerar true om tabellen är tom.
        public bool isEmpty()
        {
            if (_table != null)
                return !_table.Any();
            else
                return true; 
        }
        //returnerar första elementet eller null-motsvarighet.
        public T getFirstElement()
        {
            try
            {
                return _table[0][0];
            }
            catch
            {
                return default(T);
            }
        }
    }
}
